package com.gxnu.edu.cn.ttxxt.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gxnu.edu.cn.ttxxt.entity.GroupsMembers;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface GroupMemberRepository extends BaseMapper<GroupsMembers> {

    /**
     * 根据用户ID查询群成员关系
     * @param userId 用户ID
     * @return 群成员关系列表
     */
    List<GroupsMembers> findByUserId(@Param("userId") Long userId);

    /**
     * 根据群组ID查询群成员
     * @param groupId 群组ID
     * @return 群成员列表
     */
    List<GroupsMembers> findByGroupId(@Param("groupId") Long groupId);

    /**
     * 检查用户是否在群组中
     * @param userId 用户ID
     * @param groupId 群组ID
     * @return 是否存在
     */
    boolean existsByUserIdAndGroupId(@Param("userId") Long userId,
                                     @Param("groupId") Long groupId);

    /**
     * 根据群组ID和用户ID查询群成员
     * @param groupId 群组ID
     * @param userId 用户ID
     * @return 群成员信息
     */
    GroupsMembers selectByGroupIdAndUserId(@Param("groupId") Long groupId,
                                           @Param("userId") Long userId);

    /**
     * 根据群组ID和用户ID删除群成员
     * @param groupId 群组ID
     * @param userId 用户ID
     * @return 影响行数
     */
    int deleteByGroupIdAndUserId(@Param("groupId") Long groupId,
                                 @Param("userId") Long userId);

    /**
     * 根据群组ID删除所有群成员
     * @param groupId 群组ID
     * @return 影响行数
     */
    int deleteByGroupId(@Param("groupId") Long groupId);

    /**
     * 更新群成员信息
     * @param member 群成员信息
     * @return 影响行数
     */
    int updateMember(@Param("member") GroupsMembers member);

    /**
     * 根据角色查询群成员
     * @param groupId 群组ID
     * @param role 角色(1-普通成员，2-管理员，3-群主)
     * @return 群成员列表
     */
    List<GroupsMembers> findByGroupIdAndRole(@Param("groupId") Long groupId,
                                             @Param("role") Integer role);

    /**
     * 更新群成员信息
     * @param member 群成员信息
     * @return 影响行数
     */
    int update(GroupsMembers member);

    /**
     * 统计群组成员数量
     * @param groupId 群组ID
     * @return 成员数量
     */
    int countByGroupId(@Param("groupId") Long groupId);

    /**
     * 根据用户ID和角色查询群成员关系
     * @param userId 用户ID
     * @param role 角色
     * @return 群成员关系列表
     */
    List<GroupsMembers> findByUserIdAndRole(@Param("userId") Long userId,
                                            @Param("role") Integer role);


    void add(GroupsMembers member);


}